//package com.nf.practice.excelConvert;
//
//import com.alibaba.fastjson.JSONObject;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.poi.hssf.usermodel.HSSFWorkbook;
//import org.apache.poi.ss.usermodel.*;
//import org.apache.poi.xssf.usermodel.XSSFWorkbook;
//import org.junit.jupiter.api.Test;
//
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.math.BigDecimal;
//import java.net.URL;
//import java.net.URLConnection;
//import java.text.ParseException;
//import java.text.SimpleDateFormat;
//import java.time.LocalDate;
//import java.time.format.DateTimeFormatter;
//import java.util.*;
//import java.util.stream.Collectors;
//import java.time.LocalDate;
//import java.time.format.DateTimeFormatter;
//
//public class ReadExcel {
//
//    public static void main(String[] args) {
//        // 获取当前时间
//        Date now = new Date();
//
//        // 创建Calendar对象并设置当前时间
//        Calendar calendar = Calendar.getInstance();
//        calendar.setTime(now);
//
//        // 将日期设置为当月第一天
//        calendar.set(Calendar.DAY_OF_MONTH, 1);
//
//        // 将时间设置为零点
//        calendar.set(Calendar.HOUR_OF_DAY, 0);
//        calendar.set(Calendar.MINUTE, 0);
//        calendar.set(Calendar.SECOND, 0);
//        calendar.set(Calendar.MILLISECOND, 0);
//
//        // 获取设置后的时间
//        Date firstDayOfMonth = calendar.getTime();
//
//        System.out.println("当前时间: " + now);
//        System.out.println("当月第一天零点: " + firstDayOfMonth);
//    }
//
//
//
//    @Test
//    public void readExcelByWB() {
//        File file = new File("E:\\风险研发\\20230809发票解析\\发票2022.8-2023.8 - 脱敏样例.xls");
//        Workbook workbook = null;
//        try {
//            FileInputStream fis = new FileInputStream(file);
//            // 创建Workbook对象
//            workbook = new HSSFWorkbook(fis);
//            // 关闭输入流
//            fis.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        Sheet sheet = workbook.getSheetAt(0);
//        parseFile(sheet);
////        Map<String, String> map = new HashMap<String, String>();
////        JSONObject tempConfig = getTemplateConfig(sheet,"",map);
//    }
//
//    /**
//     * 根据前10行（10列数据拼接）以及银行编码去字典表匹配模板配置
//     * @param sheet 需解析的excel表
//     * @param openBank
//     * @return 配置内容
//     */
//    private JSONObject getTemplateConfig(Sheet sheet, String openBank, Map<String, String> map) {
//        List<String> rowDatas = new ArrayList<>();
//        for(int i = 0;i<10;i++){
//            Row row = sheet.getRow(i);
//            if(null == row){
//                continue;
//            }
//            String rowData = getFirstNCell(row,10);
//            rowDatas.add(rowData);
//        }
//        System.out.println(rowDatas);
//        return null;
//    }
//
//    private void parseFile(Sheet sheet) {
////        Integer startRow = tempConfig.getInteger("startRow");//起始行
//        Integer startRow = 2;//起始行
//        String endFlag = "";//起始行
//        Integer invoiceTypeIndex = 0;//起始行
//        Integer buyerNameIndex = 4;//结束标识 判断前10列拼接后是否包含endFlag 配置需谨慎
//        Integer invoicingDateIndex = 5;
//        Integer goodsNameIndex = 6;
//        Integer totalAmountIndex = 9;
//        Integer totalTaxAmountIndex = 11;
//        Integer cancelFlagIndex = 14;
//        String invoiceTypeStr = "增值税电子普通发票";
//        // 是否有作废标志,这个需要在配置里面加
//        String isCancelFlag = "N";
////        String dealDateFormate = tempConfig.getString("dealDateFormate");
//        String dealDateFormate = "yyyy-MM-dd HH:mm:ss";
//
//        String rowData="";//防止第一次为空时不循环
//        int i = startRow;
//        int detailsOrder = 1 ;
//        List<TmInvoiceDetails> invoiceDetailsList = new ArrayList<>();
//        while(true){
//            Row row = sheet.getRow(i);
//            if(row==null){//空行则结束
//                System.err.println("空行退出");
//                break;
//            }
//            if(i>100000){//防止死循环 10万行结束遍历
//                System.err.println("达到最大行退出");
//                break;
//            }
//            // 从这里判断到哪里该退出循环
//            rowData = getFirst10Cell(row);
//            if(StringUtils.isBlank(rowData)||(StringUtils.isNotBlank(endFlag)&&rowData.contains(endFlag))){
//                System.err.println("遇结束标识退出");
//                break;
//            }
//            TmInvoiceDetails details = new TmInvoiceDetails();
//            invoiceDetailsList.add(details);
//            if (invoiceTypeIndex != null) {
//                details.setInvoiceType(getCellValue(row,invoiceTypeIndex));
//            } else {
//                details.setInvoiceType(invoiceTypeStr);
//            }
//            details.setBuyerName(getCellValue(row,buyerNameIndex));
//            details.setInvoicingDate(getCellValue(row,invoicingDateIndex));
//            details.setGoodsName(getCellValue(row,goodsNameIndex));
//            details.setTotalAmount(getCellValue(row,totalAmountIndex));
//            details.setTotalTaxAmount(getCellValue(row,totalTaxAmountIndex));
//            // 如果有作废标志添加该字段
//            if ("Y".equals(isCancelFlag)) {
//                details.setCancelFlag(getCellValue(row,cancelFlagIndex));
//            }
//            i++;
//        }
//        System.out.println(invoiceDetailsList);
//        // 开票月份：取开票日期列，精确到月即可 invoicingMonth
//        // 普票开票金额：普票开票（剔除作废开票）后的金额/合计金额列值加总 puPiaoToalAmt
//        // 专票开票金额：专票开票（剔除作废开票）后的金额/合计金额列值加总 zuangPiaoToalAmt
//        // 作废开票金额：作废开票的金额/合计金额列值取绝对值后加总   feiPiaoTotalAmt
//        // 总计开票金额：等于【普票开票+专票开票+其他开票】（剔除作废开票）后的金额/合计金额列值加总 invoicingTotalAmt
//        // 创建一个Map来存储每个月的开票信息
//
//        // 作废开票：
//        //1）表头有作废标志字段，作废标志为“是”的
//        //2）没有作废标志字段，取表头为“金额”的所在列，值为负的
//
//        Map<String, Map<String, BigDecimal>> monthlyInvoices = new HashMap<>();
//        for (TmInvoiceDetails item : invoiceDetailsList) {
//            String invoicingMonth = getDateStr(item.getInvoicingDate());
//            String invoiceType = item.getInvoiceType();
//            String cancelFlag = item.getCancelFlag();
//            if (!monthlyInvoices.containsKey(invoicingMonth)) {
//                Map<String,BigDecimal> innerMap = new HashMap<>();
//                // 根据开票种类进行分类汇总
//                // 作废开票：
//                //1）表头有作废标志字段，作废标志为“是”的
//                //2）没有作废标志字段，取表头为“金额”的所在列，值为负的
//                if (("Y".equals(isCancelFlag) && "是".equals(cancelFlag)) ||
//                        ("N".equals(isCancelFlag) && (new BigDecimal(item.getTotalAmount()).compareTo(BigDecimal.ZERO) < 0))
//                ) {
//                    invoiceType = "作废开票";
//                }
//                if (!"作废开票".equals(invoiceType)) {
//                    innerMap.put("invoicingTotalAmt", null != innerMap.get("invoicingTotalAmt") ? new BigDecimal(item.getTotalAmount()).add(innerMap.get("invoicingTotalAmt")) : new BigDecimal(item.getTotalAmount()));
//                }
//                switch (invoiceType) {
//                    case "增值税专用发票":
//                        innerMap.put("puPiaoToalAmt", null != innerMap.get("puPiaoToalAmt") ? new BigDecimal(item.getTotalAmount()).add(innerMap.get("puPiaoToalAmt")) : new BigDecimal(item.getTotalAmount()));
//                        break;
//                    case "增值税普通发票":
//                        innerMap.put("zhuanPiaoToalAmt", null != innerMap.get("zhuanPiaoToalAmt") ? new BigDecimal(item.getTotalAmount()).add(innerMap.get("zhuanPiaoToalAmt")) : new BigDecimal(item.getTotalAmount()));
//                        break;
//                    case "作废开票":
//                        innerMap.put("feiPiaoTotalAmt", null != innerMap.get("feiPiaoTotalAmt") ? new BigDecimal(item.getTotalAmount()).add(innerMap.get("feiPiaoTotalAmt")) : new BigDecimal(item.getTotalAmount()));
//                        break;
//                    default:
//                        System.out.println("未知的开票类型: ");
//                        break;
//                }
//                monthlyInvoices.put(invoicingMonth, innerMap);
//            } else {
//                Map<String, BigDecimal> innerMap = monthlyInvoices.get(invoicingMonth);
//                // 根据开票种类进行分类汇总
//                // 根据开票种类进行分类汇总
//                // 作废开票：
//                //1）表头有作废标志字段，作废标志为“是”的
//                //2）没有作废标志字段，取表头为“金额”的所在列，值为负的
//                if (("Y".equals(isCancelFlag) && "是".equals(cancelFlag)) ||
//                        ("N".equals(isCancelFlag) && (new BigDecimal(item.getTotalAmount()).compareTo(BigDecimal.ZERO) < 0))
//                ) {
//                    invoiceType = "作废开票";
//                }
//                if (!"作废开票".equals(invoiceType)) {
//                    innerMap.put("invoicingTotalAmt", null != innerMap.get("invoicingTotalAmt") ? new BigDecimal(item.getTotalAmount()).add(innerMap.get("invoicingTotalAmt")) : new BigDecimal(item.getTotalAmount()));
//                }
//                switch (invoiceType) {
//                    case "增值税专用发票":
//                        innerMap.put("puPiaoToalAmt", null != innerMap.get("puPiaoToalAmt") ? new BigDecimal(item.getTotalAmount()).add(innerMap.get("puPiaoToalAmt")) : new BigDecimal(item.getTotalAmount()));
//                        break;
//                    case "增值税普通发票":
//                        innerMap.put("zhuanPiaoToalAmt", null != innerMap.get("zhuanPiaoToalAmt") ? new BigDecimal(item.getTotalAmount()).add(innerMap.get("zhuanPiaoToalAmt")) : new BigDecimal(item.getTotalAmount()));
//                        break;
//                    case "作废开票":
//                        innerMap.put("feiPiaoTotalAmt", null != innerMap.get("feiPiaoTotalAmt") ? new BigDecimal(item.getTotalAmount()).add(innerMap.get("feiPiaoTotalAmt")) : new BigDecimal(item.getTotalAmount()));
//                        break;
//                    default:
//                        System.out.println("未知的开票类型: ");
//                        break;
//                }
//                monthlyInvoices.put(invoicingMonth, innerMap);
//            }
//        }
//
//        monthlyInvoices.entrySet().stream()
//                .sorted(Map.Entry.comparingByKey()) // 先按照日期排序
//                .collect(Collectors.toMap(
//                        Map.Entry::getKey, // 这里我们使用键作为新的键
//                        Map.Entry::getValue, // 这里我们使用值作为新的值
//                        (oldValue, newValue) -> { // 这里我们合并旧的和新值
//                            oldValue.putAll(newValue);
//                            return oldValue;
//                        },
//                        LinkedHashMap::new // 我们使用LinkedHashMap来保留插入顺序和排序结果
//                ));
//        // 打印排序前的Map
//        System.out.println("排序前：");
//        for (String key : monthlyInvoices.keySet()) {
//            System.out.println(key);
//        }
//
////        // 排序
////        Map<String, Map<String, BigDecimal>> sortedMap = new TreeMap<>(Comparator.comparing(parseDate()));
////        sortedMap.putAll(monthlyInvoices);
////
////        // 打印排序后的Map
////        System.out.println("\n排序后：");
////        for (String key : sortedMap.keySet()) {
////            System.out.println(key);
////        }
////
////
////        System.out.println(monthlyInvoices);
////        System.out.println("==============");
//    }
//
//    private static LocalDate parseDate(String date) {
//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
//        return LocalDate.parse(date, formatter);
//    }
//
//
//
//
//    private String getDateStr(String strDate) {
//
////        SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
////        SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM");
////
////        try {
////            Date date = inputFormat.parse(dateString);
////            String formattedDate = outputFormat.format(date);
////            Date dateFormattedToDate = outputFormat.parse(formattedDate);
////            System.out.println(dateFormattedToDate);
////        } catch (ParseException e) {
////            e.printStackTrace();
////        }
//
//        SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM");
//        String convertedDate = null;
//        try {
//            Date date = inputFormat.parse(strDate);
//            convertedDate = outputFormat.format(date);
//            System.out.println(convertedDate); // 输出：2023-03
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return convertedDate;
//    }
//
//    private String getCellValue(Row row, Integer index){
//        if(index==null){
//            return "";
//        }
//
//        Cell cell = row.getCell(index);
//        if(cell==null){
//            return "";
//        }
//        switch (cell.getCellType()){
//            case Cell.CELL_TYPE_STRING:
//                return cell.getStringCellValue();
//            case Cell.CELL_TYPE_NUMERIC:
//                return getNumCellValue(cell);
//            case Cell.CELL_TYPE_BOOLEAN:
//                return cell.getBooleanCellValue()+"";
//            case Cell.CELL_TYPE_BLANK:
//                return "";
//            case Cell.CELL_TYPE_ERROR:
//                return "非法字符";
//            case Cell.CELL_TYPE_FORMULA:
//                return cell.getCellFormula()+"";
//            default:
//                return "未知类型";
//        }
//    }
//
//    private String getNumCellValue(Cell cell){
//        short format = cell.getCellStyle().getDataFormat();
//        String cellValue = "";
//        if (DateUtil.isCellDateFormatted(cell)) {
//            SimpleDateFormat sdf = null;
//            if (format == 20 || format == 32) {
//                sdf = new SimpleDateFormat("HH:mm");
//            } else if (format == 14 || format == 31 || format == 57 || format == 58) {
//                // 处理自定义日期格式：m月d日(通过判断单元格的格式id解决，id的值是58)
//                sdf = new SimpleDateFormat("yyyy-MM-dd");
//                double value = cell.getNumericCellValue();
//                Date date = org.apache.poi.ss.usermodel.DateUtil
//                        .getJavaDate(value);
//                cellValue = sdf.format(date);
//            }else {// 日期
//                sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//            }
//            try {
//                cellValue = sdf.format(cell.getDateCellValue());// 日期
//            } catch (Exception e) {
//                e.printStackTrace();
//            }finally{
//                sdf = null;
//            }
//        }  else {
//            BigDecimal bd = new BigDecimal(cell.getNumericCellValue());
//            cellValue = bd.toPlainString();// 数值 这种用BigDecimal包装再获取plainString，可以防止获取到科学计数值
//        }
//        return cellValue;
//    }
//
//    private String getFirst10Cell(Row row) {
//        return getFirstNCell(row,10);
//    }
//
//    private String getFirstNCell(Row row,int n) {
//        StringBuilder rowData = new StringBuilder();
//        for(int i = 0;i<n;i++){
//            Cell cell = row.getCell(i);
//            if(cell!=null){
//                rowData.append(getCellData(cell));
//            }
//        }
//        return rowData.toString();
//    }
//
//    private String getCellData(Cell cell){
//        if(cell==null){
//            return "";
//        }
//        String str = "";
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        switch(cell.getCellType()){
//            case Cell.CELL_TYPE_NUMERIC: //数字
//                str = String.valueOf(cell.getNumericCellValue()).trim();
//                break;
//            case Cell.CELL_TYPE_STRING: //字符串
//                str = String.valueOf(cell.getStringCellValue()).trim();
//                break;
//            case Cell.CELL_TYPE_BOOLEAN: //Boolean
//                str = String.valueOf(cell.getBooleanCellValue()).trim();
//                break;
//            case Cell.CELL_TYPE_FORMULA: //公式
//                if(DateUtil.isCellDateFormatted(cell)){
//                    //转换为日期格式YYYY-mm-dd
//                    str = sdf.format(cell.getDateCellValue()).trim();
//                }else{
//                    //数字
//                    str = String.valueOf(cell.getCellFormula()).trim();
//                }
//                break;
//            case Cell.CELL_TYPE_BLANK: //空值
//                str = "";
//                break;
//        }
//        return str;
//    }
//
//    private List<Workbook> getWorkbooks(String faPiaoFileUrl) throws Exception {
//        List<Workbook> workbooks = new ArrayList<>();
//        if(StringUtils.isBlank(faPiaoFileUrl)){
//            System.out.println("文件路径为空");
//        }
//        String[] urls = faPiaoFileUrl.split(",");
//        for(String url : urls){
//            URLConnection openConnection = new URL(url).openConnection();
//            InputStream inputStream = openConnection.getInputStream();
//
//            String extString = url.substring(url.lastIndexOf("."));
//            Workbook workbook = null;
//            if(".xls".equals(extString)){
//                workbook = new HSSFWorkbook(inputStream);
//            }else if(".xlsx".equals(extString)){
//                workbook = new XSSFWorkbook(inputStream);
//            }else{
////                logger.error("不支持的文件类型:{}",extString);
//            }
//
//            if(workbook!=null){
//                workbooks.add(workbook);
//            }
//        }
//
//        return workbooks;
//    }
//}
